/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

package ec.edu.ups.cidi.siia.plamdep.analizadorLexico.analisis;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import ec.edu.ups.cidi.siia.plamdep.configuracion.ConfiguracionAnalisiLexico;
import ec.edu.ups.cidi.siia.plamdep.interfaces.IAnalisisUtils;
import ec.edu.ups.cidi.siia.plamdep.modelo.analizadorLexico.NGrama;
import ec.edu.ups.cidi.siia.plamdep.modelo.analizadorLexico.Palabra;
import ec.edu.ups.cidi.siia.plamdep.modelo.analizadorLexico.Parrafo;

public class AnalisisUtils implements IAnalisisUtils
{
    public AnalisisUtils()
    {
        
        new Recursos();
    }
    
    public  String eliminaCaracteresDobles(String texto,String caracter)
    {
       	texto = texto.replaceAll(caracter + caracter, caracter);
        if(texto.contains(caracter+caracter))
        	 texto=eliminaCaracteresDobles(texto, caracter);
        return texto;
    }
   
    public List<Palabra> getStringAsArrayPalabras(String texto)
    {
    	 List<Palabra> palabras = new ArrayList<Palabra>();
        palabras=Recursos.freeling.analisis(texto);
        return palabras;

    }
    
    public   List<Palabra>  eliminarStopWords(List<Palabra> palabras)
    {
    	if(palabras==null)return null;
            for(int i=0;i<palabras.size();i++)
                for(String etiq:ConfiguracionAnalisiLexico.etqStopWord)
                {  
                    Palabra pal=palabras.get(i);
                    if(pal.getTipo().compareToIgnoreCase(etiq)==0)
                    {  palabras.remove(pal);
                       i--;
                       break;
                    }
                       
                    
                }   
            return palabras;
    }
   
    public static void limpiarCache()
    {
    	cacheAnalisis=new HashMap<String, List<Parrafo>>();
    	
    }
    
    /**
     * Variable que almacena los analisis
     */
    static Map<String,List<Parrafo>> cacheAnalisis=new HashMap<String, List<Parrafo>>();
     public  List<Parrafo> getParrafos( String texto ){
    	 if(cacheAnalisis.containsKey(texto))
    		 return cacheAnalisis.get(texto);
    	 
    	 
        List<Parrafo> to = new ArrayList();
    

        if(ConfiguracionAnalisiLexico.tipoAnalisis.equalsIgnoreCase("API"))
        {
        	 texto= eliminaCaracteresDobles(texto, "\n");        	
             String[] tokenizar= texto.split("\n");
             
             for(String token: tokenizar)         
             {   Parrafo prf = new Parrafo(token);
             		prf.setPalabras(Recursos.freeling.analisis(token));
                  to.add(prf);
             }     
        }
        else if(ConfiguracionAnalisiLexico.tipoAnalisis.equalsIgnoreCase("consola"))
        {
       	    to=Recursos.freeling.analisisConsola(texto,true);
        }
        
        cacheAnalisis.put(texto, to);
       return to;
    }
    /**
     * Metodo que busca las palabras mas repetidas
     * @param palabras Arreglo de palabras a analizar
     * @return ArrayList de las palabras mas repetidas.
     */
    
    public  List<Palabra> getRelevantes(List<Palabra> palabras)
    {
        HashMap<String, Integer> hs=new HashMap();
        for(Palabra p:palabras)
        {
            String pal=p.getPalabra().toLowerCase();
            if(hs.containsKey(pal))
            {
              int cont=hs.get(pal)+1;
              hs.put(pal, cont);
            }    
            else hs.put(pal, 1);
        }    
        int max=0;
        Iterator it = hs.entrySet().iterator();
        while (it.hasNext()) 
        { 
            Map.Entry<String, Integer> e = (Map.Entry)it.next(); 
            if(e.getValue()>max)max=e.getValue();
        }
        List<Palabra> relevantes= new ArrayList();
        it = hs.entrySet().iterator();
        while (it.hasNext()) 
        { 
            Map.Entry<String, Integer> e = (Map.Entry)it.next(); 
            if(e.getValue()==max)
                relevantes.add(new Palabra(e.getKey()));
        }
        return relevantes;
    }

    public List<NGrama> tokenizar(String texto, int numero) 
    {
       List<NGrama> to = new ArrayList<NGrama>();
       
       texto= eliminaCaracteresDobles(texto, " ");    
       String[] tokenizar= texto.split(" ");
       ArrayList<String> tokens = new ArrayList<String>();
       for(String token: tokenizar)  tokens.add(token); 
       while((tokens.size()%numero)!=0)  tokens.add("");
      
       int i=0;
       while(i<tokens.size())
       {
           NGrama ng = new NGrama(numero);
           for(int y = 0; y<numero;y++){
              ng.addPalabra(tokens.get(i));
              i++;
           }
                     to.add(ng);
       }
       return to ;
    }

	public List<NGrama> tokenizar(List<Palabra> palabras, int numero) {
		List<NGrama> tokens=new ArrayList<NGrama>(); 
		for(int j=0;j<palabras.size();j++)
		{	
			
			NGrama n=new NGrama(numero);
			for(int i=0;i<numero&&j<palabras.size();i++)
			{
				n.addPalabra(palabras.get(j));
				j++;
			}
			tokens.add(n);
		}
				
			
		
		return tokens;
	}

	public String getPalabrasAsString(List<Palabra> palabras) {
		String str="";
		for(Palabra p:palabras)
			str=str+p.getPalabra().replaceAll("_", " ")+" ";
		return str.trim();
	}
    


   

    
}
